iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
AI & Data

AI無法一步登天,讓我們先從專有名詞定義開始。系列 第 29

SQL迴圈實作 -9.中文文字雲的處理工廠2

  • 分享至 

  • xImage
  •  

0.ithelp_text_mand_source

這次拿來當示範的文章,是「報導者-【普悠瑪18死事故】2通簡訊示警,關鍵53分鐘危機處理待調查」。唉這起事故讓小馬接著幾天的心情都不太好,這篇報導以今天來看當然略顯過時,但它是我認為一篇,在事發隔天就快速把關鍵重點收集起來,並且條理分明邏輯清楚的好文章。

資料匯入後的長相是這樣:
https://ithelp.ithome.com.tw/upload/images/20181026/201115662C1QSPid36.png

看上去也是蠻雜亂的,再次提醒這邊要留意的關鍵,在於所有要被你拿來做文字雲的文字,必須統一放在target這個欄位裡,後續才處理得到。當然啦......如果一不小心匯入變成好幾個欄位,就把這幾個欄位黏起來命名成target,也無可厚非,也是可以拿來繼續處理的,這都算清洗的範疇內。

1.ithelp_wordcloudmand_t1_source

DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source; 
CREATE TABLE ithelp_wordcloudmand_t1_source as
select TRANSLATE(
target,'//,。、,;;::()()「」【】??~!!<>.《》''','                               ')
||' END' target
from ithelp_text_mand_source
;
select * from ithelp_wordcloudmand_t1_source

因為兩天前處理英文文字雲時有詳細說明,這邊當作複習,將會比較快速的帶過。

上面的步驟,一樣是利用TRANSLATE()將所有的標點符號,替換成半形空格。中文文章裡面出現英文的機會比較低,上面SQL沒有加上lower(),要不要加,端看處裡的文章內容而訂,你也可以補上去。最後一樣加了' END',你想加' LOVE'或任何一個最前面帶有空格的中英文字,都可以,只是為了讓最後一句話也能被收進去。

處理後,你會發現所有的編點符號,都被取代成了半形空格,
資料長度較短的也會直接看到我加上去的' END'標記:
https://ithelp.ithome.com.tw/upload/images/20181026/20111566Y8uejZSLLn.png

2.ithelp_wordcloudmand_t2_processing

DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing; 
CREATE TABLE ithelp_wordcloudmand_t2_processing as 
select *,
                 STRPOS(target,' ')    tag,
     LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
select * from ithelp_wordcloudmand_t2_processing

和英文文字雲相同的步驟2,找到半形空格位置,命名為tag,之後要做控制項;將第一句話切成goal,準備拿去收納;將第二句話往後的全部文字,切成next_target,準備繼續處理。

在這次的實際範例裡,就會處理如下:
https://ithelp.ithome.com.tw/upload/images/20181026/201115663UkU9FPjmu.png

3.ithelp_wordcloudmand_t3_goalwarehouse

DROP TABLE IF EXISTS ithelp_wordcloudmand_t3_goalwarehouse; 
CREATE TABLE ithelp_wordcloudmand_t3_goalwarehouse as
select goal 
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0
;
select * from ithelp_wordcloudmand_t3_goalwarehouse

和英文文字雲相同的步驟3,建出goal的倉庫(goal-warehouse),這次只會把第一次跑出來的goal給放進去。步驟裡一樣限定了:收進goal-warehouse的單字必須不是null、必須不是空白、必須tag>0。

將迴圈內容keep in mind

--t1
DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source; 
CREATE TABLE ithelp_wordcloudmand_t1_source as
select next_target target
from ithelp_wordcloudmand_t2_processing
;
--t2
DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing; 
CREATE TABLE ithelp_wordcloudmand_t2_processing as 
select *,
                 STRPOS(target,' ')    tag,
     LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
--t3
INSERT into ithelp_wordcloudmand_t3_goalwarehouse
select goal
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0;

再次很快提醒上面的差異:

t1第一次是從source去建,第二次開始是拿t2來重建t1。
t2第一次與後面每一次,做的事情都一模一樣。
t3第一次是create table,第二次開始是insert into。

先記著,這等下要丟進迴圈裡面去跑,但在建置迴圈前,我們必須先去建好控制項。

4.ithelp_wordcloudmand_t4_loopfunction_1

DROP FUNCTION IF EXISTS ithelp_wordcloudmand_1();
CREATE OR REPLACE FUNCTION ithelp_wordcloudmand_1()
RETURNS INTEGER as
$BODY$
BEGIN
RETURN tag
from (
select MAX(tag) over (PARTITION BY 1) tag
from ithelp_wordcloudmand_t2_processing
) A
group by tag
;
END
$BODY$
LANGUAGE 'plpgsql';

和英文文字雲相同的步驟4,要讓迴圈執行到每一列(每一筆資料)的tag都歸0為止,可以想像只要有某一筆資料tag還不是0,整個function return出來的整數就還不是0。當ithelp_wordcloud_1() > 0 的時候執行迴圈,在等下會放進迴圈的控制項位置。

5.ithelp_wordcloudmand_t5_loopfunction_2

----------以下開始ithelp_wordcloudmand_2的設定----------
DROP FUNCTION IF EXISTS ithelp_wordcloudmand_2();
CREATE OR REPLACE FUNCTION ithelp_wordcloudmand_2() RETURNS void as
$BODY$
BEGIN
----------以下開始【控制項】設定----------
WHILE ithelp_wordcloudmand_1() > 0
----------以上結束【控制項】設定----------
----------以下開始【迴圈內容】設定----------
LOOP
--t1
DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source; 
CREATE TABLE ithelp_wordcloudmand_t1_source as
select next_target target
from ithelp_wordcloudmand_t2_processing
;
--t2
DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing; 
CREATE TABLE ithelp_wordcloudmand_t2_processing as 
select *,
                 STRPOS(target,' ')    tag,
     LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
--t3
INSERT into ithelp_wordcloudmand_t3_goalwarehouse
select goal
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0;
END LOOP
----------以上結束【迴圈內容】設定----------
;
END
$BODY$
LANGUAGE 'plpgsql';
----------以上結束ithelp_wordcloudmand_2的設定----------

和英文文字雲相同的步驟5,留意三個區塊即可:

1.目的是執行,因此不返回任何東西:RETURNS void
2.控制項放的位置
3.要執行三個重複步驟t1~t3放的位置

執行迴圈、查看倉庫

最後,記得實際去執行這個function,然後把成果(goal-warehouse)叫出來看看。

select ithelp_wordcloudmand_2();
select * from ithelp_wordcloudmand_t3_goalwarehouse

這時候存放於t3_goalwarehouse裡面的,已經是利用標點符號拆開成的單字或句子(在原始文章內,中間沒有標點符號也沒有被切開成段落的單字或句子)。

在英文,這步做完已經是每個單字,在中文,只是把句子拆開而已。

https://ithelp.ithome.com.tw/upload/images/20181029/20111566VAs3EiJAHc.png

共有412筆資料,如Excel檔案(.xlsx)
外迴圈的實例說明至這篇文章為止,已完全結束,明天會利用內迴圈,把剩下來的工作處理完。

外迴圈,即是一種AI精神。

事實上,外迴圈的概念就是一套完整的AI建置過程:
https://ithelp.ithome.com.tw/upload/images/20181029/20111566sgKHGJLgvB.png
將大量的資料,不斷地送給設計好的迴圈循環,讓所謂AI,不斷訓練、不斷學習、不斷累積AI所擁有的經驗與知識,重點是:AI還不會覺得累!

透過上述流程我們也可以發現,AI要如何去學習、學到什麼地步才是「學成出師」,仍舊看人類對於「學成出師」的定義是什麼。就像是,當我們用了英文為範例,AI走完上面五堂學習課程,就已經把單字給處理完,但換成中文,卻仍只是個四不像的半成品。

這中間難道有辦法發展成,讓AI自行判斷自己「學成出師」了沒,厲害到AI自己知道念英文只要念五堂,念中文要念八堂?以小馬經驗至今,我認為這還是很遙遠的目標,現在的AI,背後仍舊是滿滿的人工判斷。然而小馬認為這無可厚非,畢竟它就是「人工」「智慧」嘛,而不是「外星生物」啊!

這也是我最近跟同行聊到AI很常說的話:

你那個不叫AI,你那個叫外星人,人類是製造不出外星人的。




上一篇:
SQL迴圈實作 -8.中文文字雲的處理工廠1
下一篇:
SQL迴圈實作 -10.中文文字雲的處理工廠3


上一篇
SQL迴圈實作 -8.中文文字雲的處理工廠1
下一篇
SQL迴圈實作 -10.中文文字雲的處理工廠3
系列文
AI無法一步登天,讓我們先從專有名詞定義開始。31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言